package main

import (
	"fmt"
	"sync"
	"time"
)

// 保证在同一时间段内有且仅有一个goroutine持有锁
//
// 这就保证了在某一时间段内有且仅有一个goroutine访问共享资源，其他申请锁的goroutine将会被阻塞直到锁被释放
func main() {
	var lock sync.Mutex

	go getLock("func-one", &lock)
	go getLock("func4-two", &lock)
	go getLock("func4-three", &lock)

	time.Sleep(time.Second * 5)

}

// getLock
//
//	@Description: 获取锁
//	@param fun
//	@param lock
func getLock(fun string, lock *sync.Mutex) {
	fmt.Println(fun, " [start at]:", time.Now())
	defer lock.Unlock()
	lock.Lock()
	fmt.Println(fun, " get lock at:", time.Now())
	time.Sleep(time.Second)
	fmt.Println(fun, " release lock at:", time.Now())
}
